/**
 * 我们所创建的每个函数，解析器都会向函数中添加一个属性prototype
 *  这个属性对应一个对象，这个对象就是我们所谓的原型对象
 *
 * 如果函数以普通函数调用prototype没有任何作用
 *
 * 当函数以构造函数的形式调用时，它所创建的对象都会有一个隐含的属性，
 *  指向该构造函数的原型对象，可以通过__proto__来访问该属性
 *
 * 使用in检查对象中是否有某个属性，会包括原型中的属性，应该使用hasOwnProperty方法
 *
 * 当使用一个对象的属性或方法时，会先在自身中寻找
 *      自身如果有，则直接使用
 *      如果没有则去原型对象中寻找，如果原型对象中有，则使用
 *      如果没有则去原型的原型中寻找，直到找到Object.prototype，没有则返回undefined
 */

/* function MyClass() {}

MyClass.prototype.a = 123;

var m1 = new MyClass(); */
// console.log(m1.hasOwnProperty("a"));
// console.log(m1.__proto__);
// console.log(m1.__proto__.__proto__);
// console.log(m1.__proto__.__proto__.__proto__);
// console.log(m1.__proto__.__proto__.__proto__.__proto__);

function Person(name, age) {
  this.name = name;
  this.age = age;
}

var per = new Person("孙悟空", 18);

per.toString = function () {
  console.log(`Person[name=${this.name}], age=${this.age}`);
};

console.log(per);
